﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;

namespace EventPlanner.Models
{
    /* Clase para modelar los datos de un evento (con validaciones) */

    public class Evento : IValidatableObject
    {
        public int ID { get; set; }
        

        [Required]
        public string Nombre { get; set; }

        public string TipoDeEntrada { get; set; }
        
        public Ubicacion Lugar { get; set; }
        
        [Required]
        [DataType(DataType.DateTime)]
        [DisplayName("Fecha y hora de inicio del evento")]
        public virtual DateTime Inicio { get; set; }

        [DataType(DataType.DateTime)]
        [DisplayName("Fecha y hora de finalización del evento")]
        public virtual Nullable<DateTime> Fin { get; set; }        
                
        [Required]
        [DisplayName("¿Cantidad de participantes limitada?")]
        public bool CapacidadLimitada { get; set; }

        [DisplayName("Cupo Máximo")]
        public Nullable<int> CupoMaximo { get; set; }

        [Required]
        [DisplayName("¿Existe fecha límite de inscripción?")]
        public bool PoseeFechaLimiteInscrip { get; set; }

        [DisplayName("Fecha Límite de Inscripción")]
        public Nullable<DateTime> FechaLimiteInscrip { get; set; }

        [Required]
        [DisplayName("Usuario que creo el evento")]
        public string WebSiteUser { get; set; }

        [Required]
        [DisplayName("Nombre del Organizador ó Empresa")]
        public string NombreOrganizador { get; set; }

        [DisplayName("Teléfono del Organizador ó Empresa")]
        public string TelefonoOrganizador { get; set; }

        [DisplayName("Mail del Organizador ó Empresa")]
        public string MailOrganizador { get; set; }

        [DisplayName("Web Site del Organizador ó Empresa")]
        public string WebSiteOrganizador { get; set; }

        [DisplayName("Usuarios inscriptos al Evento")]
        public virtual ICollection<Usuario> UsuariosInscriptos { get; set; }        
            

        /* Validaciones del modelo */
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
        {
            var results = new List<ValidationResult>();
            if (this.PoseeFechaLimiteInscrip)
            {
                if (!(this.FechaLimiteInscrip.HasValue))
                {
                    results.Add(new ValidationResult("La fecha no puede ser vacío", new[] { "FechaLimiteInscrip" }));
                }
            }
            
            if (this.CapacidadLimitada)
            {
                if (!(this.CupoMaximo.HasValue) )
                {
                    results.Add(new ValidationResult("El cupo máximo no puede ser vacío", new[] { "CupoMaximo" }));
                }                                                                                   
            }

            if (Inicio > Fin)
            {
                results.Add(new ValidationResult("La fecha de inicio debe ser menor a la de finalización", new[] { "Inicio" }));
            }            

            if (Inicio < DateTime.Now)
            {
                results.Add(new ValidationResult("La fecha no puede ser en el pasado", new[] { "Inicio" }));
            }

            if (Fin < DateTime.Now)
            {
                results.Add(new ValidationResult("La fecha no puede ser en el pasado", new[] { "Inicio" }));
            }

            if (!(this.CapacidadLimitada))
            {
                CupoMaximo = null;
            }

            if (!(this.PoseeFechaLimiteInscrip))
            {
                FechaLimiteInscrip = null;
            }



            return results;
        }


    }
}